{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "bb22edc0",
   "metadata": {},
   "source": [
    "<table align=\"left\">\n",
    "  <td>\n",
    "    <a href=\"https://colab.research.google.com/github/nyandwi/machine_learning_complete/blob/main/9_nlp_with_tensorflow/4_using_cnns_and_rnns_for_texts_classification.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>\n",
    "  </td>\n",
    "</table>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0fd12820",
   "metadata": {},
   "source": [
    "*This notebook was created by [Jean de Dieu Nyandwi](https://twitter.com/jeande_d) for the love of machine learning community. For any feedback, errors or suggestion, he can be reached on email (johnjw7084 at gmail dot com), [Twitter](https://twitter.com/jeande_d), or [LinkedIn](https://linkedin.com/in/nyandwi).*"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "304ad719",
   "metadata": {
    "id": "304ad719"
   },
   "source": [
    "<a name='0'></a>\n",
    "# Using Convolutional Neural Networks for Texts Classification"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b6a095ea",
   "metadata": {
    "id": "b6a095ea"
   },
   "source": [
    "## Contents \n",
    "\n",
    "* [1. Intro Convolutional Neural Networks for Texts](#1)\n",
    "* [2. CNN for Texts in Practice: News Classification](#2)\n",
    "   * [2.1 Getting the data](#2-1)\n",
    "   * [2.2 Preparing the data](#2-2)\n",
    "   * [2.3 Building, compiling and training a RNN model](#2-3)\n",
    "   * [2.4 Visualizing the model results](#2-4)\n",
    "\n",
    "* [3.Combining ConvNets and RNNs](#3)\n",
    "   * [3.1 ConvNets and RNNs model](#3-1)\n",
    "   * [3.2 Visualizing the model results](#3-2)\n",
    "   * [3.3 Performing Inference On New Texts](#3-3)\n",
    "\n",
    "* [4. Further Learning](#4)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "NpH129c1ipzK",
   "metadata": {
    "id": "NpH129c1ipzK"
   },
   "source": [
    "<a name='1'></a>\n",
    "# 1. Intro to CNNs for Texts"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fun0mLu0uAV9",
   "metadata": {
    "id": "fun0mLu0uAV9"
   },
   "source": [
    "Convolutional neural networks are remarkably a suitable network architectures for images, or computer vision tasks in general because of their ability to extract features from images using filters. \n",
    "\n",
    "A recent studies([Text Understanding from Scratch by Xiang Zhang & Yann LeCun](https://arxiv.org/pdf/1502.01710.pdf), [Recurrent Convolutional Neural Networks for Text Classification by Siwei Lai & Liheng Xu & Kang Liu & Jun Zhao](https://www.aaai.org/ocs/index.php/AAAI/AAAI15/paper/view/9745/9552)) has shown that CNNs can also perform wel on texts just as they do on images.\n",
    "\n",
    "Quoting [LeCun paper](https://arxiv.org/pdf/1502.01710.pdf), \n",
    "\n",
    "* CNNs don't require knowledge of words. And that means it is fine to pass characters to the network. We have previously been using words.\n",
    "* CNNs do not require knowledge of syntax or semantic structures. \n",
    "* While RNNs can be expensive to run, CNNs are away cheaper.\n",
    "\n",
    "\n",
    "In text applications or any sequential datasets in general, we use [Conv1D](https://keras.io/api/layers/convolution_layers/convolution1d/) instead of Conv2D.  The design of Conv1D is quite similar to Conv2D, the only difference is the dimension of the input. So, it is made of convolution and pooling layers. "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "QzQ1mCjR4bxC",
   "metadata": {
    "id": "QzQ1mCjR4bxC"
   },
   "source": [
    "Below is a typical CNN inspired design for texts. Source: Text Understanding from Scratch, Yann LeCun."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "QE0Tx65g4T5g",
   "metadata": {
    "id": "QE0Tx65g4T5g"
   },
   "source": [
    "![Contexts.png]()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "272zy0n35nEM",
   "metadata": {
    "id": "272zy0n35nEM"
   },
   "source": [
    "Here is the overview of the main parameters of Conv1D. \n",
    "\n",
    "If you worked with CNNs before, you probably don't see any new thing. `filters` specify the number of filters, `kernel_size` denotes the size of each filter (remember it is one dimension), `strides` is the number of steps the filter will take as it go through the input texts, `padding` for ading zeros (`valid` for not padding, `same` for padding). And `activation` denotes the activation function to use. \n",
    "\n",
    "```\n",
    "tf.keras.layers.Conv1D(\n",
    "    filters,\n",
    "    kernel_size,\n",
    "    strides=1,\n",
    "    padding=\"valid\",\n",
    "    activation=None,\n",
    ")\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "BXTCCnOU7KVh",
   "metadata": {
    "id": "BXTCCnOU7KVh"
   },
   "source": [
    "<a name='2'></a>\n",
    "\n",
    "# 2. CNN's for Texts In Practice: News Classification"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "pqHlvqcJ7a6R",
   "metadata": {
    "id": "pqHlvqcJ7a6R"
   },
   "source": [
    "<a name='2-1'></a>\n",
    "## 2.1 Getting the Data"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "TG6BxjO92vvT",
   "metadata": {
    "id": "TG6BxjO92vvT"
   },
   "source": [
    "In this practice, we will use [news dataset, `ag_news_subset`](https://www.tensorflow.org/datasets/catalog/ag_news_subset) that is available on TensorFlow datasets. \n",
    "\n",
    "TensorFlow datasets is a collection of awesome datasets that can be used right away with little preparations. \n",
    "\n",
    "AG is a collection of more than 1 million news articles gathered from more than 2000 news sources by ComeToMyHead in more than 1 year of activity. \n",
    "\n",
    "The AG dataset contains 4 classes that are: World(0), Sports(1), Business(2), Sci/Tech(3). The total number of training samples is 120,000 and testing 7,600. Each class contains 30,000 training samples and 1,900 testing samples. \n",
    "\n",
    "You can learn more about the dataset [here](http://groups.di.unipi.it/~gulli/AG_corpus_of_news_articles.html), or read the orginal paper that used it to explore the use of [character-level convolutional networks (ConvNets) for text classification](https://arxiv.org/abs/1509.01626) by Xiang Zhang, Junbo Zhao, and Yann LeCun.\n",
    "\n",
    "Let's get the dataset from TensorFlow datasets."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "KSI9Qwk47Spm",
   "metadata": {
    "id": "KSI9Qwk47Spm"
   },
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "from tensorflow import keras\n",
    "import tensorflow_datasets as tfds\n",
    "import numpy as np\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "IXx5GoVr2_za",
   "metadata": {
    "id": "IXx5GoVr2_za"
   },
   "source": [
    "The dataset that we are going to download has only one version so far. Let's specify it so that when it is updated, our lab will not be affected. If loading the data fails, run the cell again. It happens sometime when loading datasets from TF datasets.\n",
    "\n",
    "Orginally, the training set contains 120.000 news samples, whereas test set contain 7600 samples. Let's take 10% percent of news from training set to validation set so we can increase it a little bit.  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "Z2mJo33Y3AGX",
   "metadata": {
    "id": "Z2mJo33Y3AGX"
   },
   "outputs": [],
   "source": [
    "(train_data, val_data), info = tfds.load('ag_news_subset:1.0.0', #version 1.0.0\n",
    "                                         split=['train[:90%]', 'train[90%:]+test'],\n",
    "                                         with_info=True, \n",
    "                                         as_supervised=True\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "rf10m2Fn3E_C",
   "metadata": {
    "id": "rf10m2Fn3E_C"
   },
   "source": [
    "We can display the `info` that we loaded with dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "hmLo3Dn04vO1",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "hmLo3Dn04vO1",
    "outputId": "eac9d2ff-c74d-4271-db98-921b56047ae5"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tfds.core.DatasetInfo(\n",
      "    name='ag_news_subset',\n",
      "    version=1.0.0,\n",
      "    description='AG is a collection of more than 1 million news articles.\n",
      "News articles have been gathered from more than 2000  news sources by ComeToMyHead in more than 1 year of activity.\n",
      "ComeToMyHead is an academic news search engine which has been running since July, 2004.\n",
      "The dataset is provided by the academic comunity for research purposes in data mining (clustering, classification, etc),\n",
      "information retrieval (ranking, search, etc), xml, data compression, data streaming,\n",
      "and any other non-commercial activity.\n",
      "For more information, please refer to the link http://www.di.unipi.it/~gulli/AG_corpus_of_news_articles.html .\n",
      "\n",
      "The AG's news topic classification dataset is constructed by Xiang Zhang (xiang.zhang@nyu.edu) from the dataset above.\n",
      "It is used as a text classification benchmark in the following paper:\n",
      "Xiang Zhang, Junbo Zhao, Yann LeCun. Character-level Convolutional Networks for Text Classification. Advances in Neural Information Processing Systems 28 (NIPS 2015).\n",
      "\n",
      "The AG's news topic classification dataset is constructed by choosing 4 largest classes from the original corpus.\n",
      "Each class contains 30,000 training samples and 1,900 testing samples.\n",
      "The total number of training samples is 120,000 and testing 7,600.',\n",
      "    homepage='https://arxiv.org/abs/1509.01626',\n",
      "    features=FeaturesDict({\n",
      "        'description': Text(shape=(), dtype=tf.string),\n",
      "        'label': ClassLabel(shape=(), dtype=tf.int64, num_classes=4),\n",
      "        'title': Text(shape=(), dtype=tf.string),\n",
      "    }),\n",
      "    total_num_examples=127600,\n",
      "    splits={\n",
      "        'test': 7600,\n",
      "        'train': 120000,\n",
      "    },\n",
      "    supervised_keys=('description', 'label'),\n",
      "    citation=\"\"\"@misc{zhang2015characterlevel,\n",
      "        title={Character-level Convolutional Networks for Text Classification},\n",
      "        author={Xiang Zhang and Junbo Zhao and Yann LeCun},\n",
      "        year={2015},\n",
      "        eprint={1509.01626},\n",
      "        archivePrefix={arXiv},\n",
      "        primaryClass={cs.LG}\n",
      "    }\"\"\",\n",
      "    redistribution_info=,\n",
      ")\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(info)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "G32J1NS54wYm",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "G32J1NS54wYm",
    "outputId": "95606802-5e08-4858-e9d1-9b1f00e87145"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The news are grouped into 4 classes that are :['World', 'Sports', 'Business', 'Sci/Tech']\n"
     ]
    }
   ],
   "source": [
    "# Displaying the classes\n",
    "\n",
    "class_names = info.features['label'].names\n",
    "num_classes = info.features['label'].num_classes\n",
    "\n",
    "print(f'The news are grouped into {num_classes} classes that are :{class_names}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "mT0JR6ob43Ng",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "mT0JR6ob43Ng",
    "outputId": "7a9914bd-a456-4806-d8d3-f78137445820"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The number of training samples: 120000 \n",
      "The number of validation samples: 7600\n"
     ]
    }
   ],
   "source": [
    "num_train = info.splits['train'].num_examples\n",
    "num_val = info.splits['test'].num_examples\n",
    "\n",
    "print(f'The number of training samples: {num_train} \\nThe number of validation samples: {num_val}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "jkR39PTM5DDp",
   "metadata": {
    "id": "jkR39PTM5DDp"
   },
   "source": [
    "We can also display the first 10 news samples. We can use [`tfds.as_dataframe`](https://www.tensorflow.org/datasets/api_docs/python/tfds/as_dataframe) to display them as dataframe."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "aKtBJWMT5DeM",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 359
    },
    "id": "aKtBJWMT5DeM",
    "outputId": "d2d3878d-c355-4d09-b125-0fc6332473bb"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>description</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>b'AMD #39;s new dual-core Opteron chip is desi...</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>b'Reuters - Major League Baseball\\\\Monday anno...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>b'President Bush #39;s  quot;revenue-neutral q...</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>b'Britain will run out of leading scientists u...</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>b'London, England (Sports Network) - England m...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>b'TOKYO - Sony Corp. is banking on the \\\\$3 bi...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>b'Giant pandas may well prefer bamboo to lapto...</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>b'VILNIUS, Lithuania - Lithuania #39;s main pa...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>b'Witnesses in the trial of a US soldier charg...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>b'Dan Olsen of Ponte Vedra Beach, Fla., shot a...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                         description  label\n",
       "0  b'AMD #39;s new dual-core Opteron chip is desi...      3\n",
       "1  b'Reuters - Major League Baseball\\\\Monday anno...      1\n",
       "2  b'President Bush #39;s  quot;revenue-neutral q...      2\n",
       "3  b'Britain will run out of leading scientists u...      3\n",
       "4  b'London, England (Sports Network) - England m...      1\n",
       "5  b'TOKYO - Sony Corp. is banking on the \\\\$3 bi...      0\n",
       "6  b'Giant pandas may well prefer bamboo to lapto...      3\n",
       "7  b'VILNIUS, Lithuania - Lithuania #39;s main pa...      0\n",
       "8  b'Witnesses in the trial of a US soldier charg...      0\n",
       "9  b'Dan Olsen of Ponte Vedra Beach, Fla., shot a...      1"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "news_df = tfds.as_dataframe(train_data.take(10), info)\n",
    "\n",
    "news_df.head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1OSoHhYq5Hqg",
   "metadata": {
    "id": "1OSoHhYq5Hqg"
   },
   "source": [
    "Let's display some full news."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "y4JUuXFK5H9l",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "y4JUuXFK5H9l",
    "outputId": "86460046-df22-4ebb-aaee-ffd66291503b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sample news 0\n",
      "   Label: 3 World\n",
      "   Description: b'AMD #39;s new dual-core Opteron chip is designed mainly for corporate computing applications, including databases, Web services, and financial transactions.'\n",
      "----------\n",
      "\n",
      "Sample news 1\n",
      "   Label: 1 Sports\n",
      "   Description: b'Reuters - Major League Baseball\\\\Monday announced a decision on the appeal filed by Chicago Cubs\\\\pitcher Kerry Wood regarding a suspension stemming from an\\\\incident earlier this season.'\n",
      "----------\n",
      "\n",
      "Sample news 2\n",
      "   Label: 2 Business\n",
      "   Description: b'President Bush #39;s  quot;revenue-neutral quot; tax reform needs losers to balance its winners, and people claiming the federal deduction for state and local taxes may be in administration planners #39; sights, news reports say.'\n",
      "----------\n",
      "\n",
      "Sample news 3\n",
      "   Label: 3 Sci/Tech\n",
      "   Description: b'Britain will run out of leading scientists unless science education is improved, says Professor Colin Pillinger.'\n",
      "----------\n",
      "\n"
     ]
    }
   ],
   "source": [
    "for i in range (0,4):\n",
    "\n",
    "  print(f\"Sample news {i}\\n \\\n",
    "  Label: {news_df['label'][i]} {(class_names[i])}\\n \\\n",
    "  Description: {news_df['description'][i]}\\n----------\\n\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "RYEEIev16Aa7",
   "metadata": {
    "id": "RYEEIev16Aa7"
   },
   "source": [
    "<a name='2-2'></a>\n",
    "\n",
    "## 2.2 Preparing the Data"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b8l6X1v36H0A",
   "metadata": {
    "id": "b8l6X1v36H0A"
   },
   "source": [
    "We can not feed the raw texts that we loaded from the tensorflow datasets to the model. We have to do some preps works.\n",
    "\n",
    "One of the major thing we have to do is to vectorize the texts or convert them into numeric tokens. \n",
    "\n",
    "We will use [TextVectorizer](https://keras.io/api/layers/preprocessing_layers/text/text_vectorization/), but before we get there, let's first shuffle and batch the training data. \n",
    "\n",
    "For validation data and test data, we don't shuffle. We only batch it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "KfpIlhP96CLa",
   "metadata": {
    "id": "KfpIlhP96CLa"
   },
   "outputs": [],
   "source": [
    "buffer_size = 1000\n",
    "batch_size = 32\n",
    "\n",
    "train_data = train_data.shuffle(buffer_size)\n",
    "train_data = train_data.batch(batch_size).prefetch(1)\n",
    "val_data = val_data.batch(batch_size).prefetch(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fbI0U5jn6KXo",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "fbI0U5jn6KXo",
    "outputId": "05eea6a0-27c5-4166-a1ea-39d0e25e2baa"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sample news\n",
      "----\n",
      " [b'About seven or eight years ago, Harry Shatel had that conversation with Charlie Weis about the future. Shatel, the Morristown High School baseball coach, doesn #39;t remember the exact date '\n",
      " b\"AFP - Australia's foreign minister will pay a rare visit to North Korea this week for talks on its nuclear programme after creating a stir here by warning a North Korean missile would be able to hit Sydney.\"\n",
      " b' quot;The Electoral Commission set the date of January 30 as the date of the election, quot; spokesman Farid Ayar told Reuters on Sunday.'\n",
      " b'That photo above is no longer accurate. I #39;ve shaven my head to protest the firing of ... Kevin from The Apprentice. Dude has a bachelor #39;s from Penn, an MBA from Emory and is working on a law degree from the '] \n",
      "----\n",
      "Corresponding labels: [1 0 0 1]\n"
     ]
    }
   ],
   "source": [
    "for news, label in train_data.take(1):\n",
    "\n",
    "  print(f'Sample news\\n----\\n {news.numpy()[:4]} \\n----\\nCorresponding labels: {label.numpy()[:4]}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ftxhoGwA6Plv",
   "metadata": {
    "id": "ftxhoGwA6Plv"
   },
   "source": [
    "As you can see from the above, the training data is in batches of descriptions and their corresponding labels.\n",
    "\n",
    "Now, we can use Keras [TextVectorization layer](https://keras.io/api/layers/preprocessing_layers/text/text_vectorization/) to handle all required text preprocessing. It will convert the texts into tokens, convert them into sequences, padd the sequences. It also removes punctuations and lower the case. \n",
    "\n",
    "That's all it does by default."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "j7YQp-GD6QET",
   "metadata": {
    "id": "j7YQp-GD6QET"
   },
   "outputs": [],
   "source": [
    "max_features = 10000\n",
    "\n",
    "text_vectorizer = tf.keras.layers.TextVectorization(max_tokens=max_features)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "u0p_Lzz56esO",
   "metadata": {
    "id": "u0p_Lzz56esO"
   },
   "source": [
    "After creating the layer, we can use `adapt` to pass the dataset throught it. Notice that we use `lambda function` to get the description separated from the label."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "tJwy1mh56fFl",
   "metadata": {
    "id": "tJwy1mh56fFl"
   },
   "outputs": [],
   "source": [
    "text_vectorizer.adapt(train_data.map(lambda description, label : description))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aN7JPrbn6jW-",
   "metadata": {
    "id": "aN7JPrbn6jW-"
   },
   "source": [
    "We can get the vocabulary. Vocabulary is the list of individual words making up a particular sentence."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "G98SCvGH6jrb",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "G98SCvGH6jrb",
    "outputId": "e5eb5e64-34bd-4858-8fa4-042a2826a25a"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['', '[UNK]', 'the', 'a', 'to', 'of', 'in', 'and', 'on', 'for']"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vocab = text_vectorizer.get_vocabulary()\n",
    "vocab[:10]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "lTgHmoRV6p9_",
   "metadata": {
    "id": "lTgHmoRV6p9_"
   },
   "source": [
    "Let's pass some new sentences to `text_vectorizer`. The vectorized sequences will be padded with the maximum sentences, but if you want to hava fixed size, you can set the `output_sequence_length` to any value in the layer initialization."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "yMwj0TGn6qMT",
   "metadata": {
    "id": "yMwj0TGn6qMT"
   },
   "outputs": [],
   "source": [
    "sample_news = ['This weekend there is a sport match between Man U and Fc Barcelona',\n",
    "               'Tesla has unveiled its humanoid robot that appeared dancing during the show!']\n",
    "\n",
    "              "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "DfVgDDte6sWI",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "DfVgDDte6sWI",
    "outputId": "97ec1d94-3721-44d6-b862-832d7a5fd0da"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  40,  494,  186,   16,    3, 1567,  570,  159,  370,    1,    7,\n",
       "        7486, 2556],\n",
       "       [   1,   20,  876,   13,    1, 4845,   10, 1273,    1,  160,    2,\n",
       "         532,    0]])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vectorized_news = text_vectorizer(sample_news)\n",
    "vectorized_news.numpy()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "NhEnE1ZP6wcN",
   "metadata": {
    "id": "NhEnE1ZP6wcN"
   },
   "source": [
    "If you can look on the above tensors, the second sentence was padded with 0. Also the words `Tesla` and `humanoid` have an indice of 1 because they were not a part of the training data (that we adapted to the `text_vectorizer`). \n",
    "\n",
    "So this means that the indice 1 is reserved for all words that are new to the layer. In the vocabulary, these kind of words are replaced by `UNK`.\n",
    "\n",
    "We will use `text_vectorizer` as part of the model."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "HXZepCAC8U3Y",
   "metadata": {
    "id": "HXZepCAC8U3Y"
   },
   "source": [
    "<a name='2-3'></a>\n",
    "\n",
    "## 2.3 Creating and Training the Model"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bpdBOnCN8arH",
   "metadata": {
    "id": "bpdBOnCN8arH"
   },
   "source": [
    "We are going to create a Keras Sequential model that takes the texts input and output the class of the input texts.\n",
    "\n",
    "The model is going to be made of the following layers:\n",
    "\n",
    "* `TextVectorization layer` for texts preprocessing.\n",
    "\n",
    "* `Embedding layer` for representing the tokens into a trainable feature vector of a high dimensional space. Because the feature vector is trainable, after training the words that have the same semantic meaning will end up having the same vectors (and pointing to the same directions).\n",
    "\n",
    "* `A Conv1D` for processing the sequences. Yes, Convnets can be used for texts processing. We will start off with only Convnets, and later use RNNs as well.\n",
    "\n",
    "* `Dense layer` for classification purpose. It takes the vector and convert it into a single logit output."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "KSqjXxr06w42",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "KSqjXxr06w42",
    "outputId": "a3e1f5ed-b228-4eb6-ac1d-eec5f817d945"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10000"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "input_dim = len(text_vectorizer.get_vocabulary())\n",
    "input_dim "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "57w5pGZkPv0D",
   "metadata": {
    "id": "57w5pGZkPv0D"
   },
   "outputs": [],
   "source": [
    "model = tf.keras.Sequential([\n",
    "    text_vectorizer,\n",
    "    tf.keras.layers.Embedding(input_dim=input_dim, output_dim=64, mask_zero=True),\n",
    "    tf.keras.layers.Conv1D(64, 5, activation='relu'),\n",
    "    tf.keras.layers.MaxPooling1D(),\n",
    "    tf.keras.layers.Conv1D(64, 5, activation='relu'),\n",
    "    tf.keras.layers.GlobalMaxPool1D(),\n",
    "    tf.keras.layers.Dense(32, activation='relu'),\n",
    "    tf.keras.layers.Dropout(0.3),\n",
    "    tf.keras.layers.Dense(4, activation='softmax')\n",
    "])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "gUIFQg-e_Lm3",
   "metadata": {
    "id": "gUIFQg-e_Lm3"
   },
   "source": [
    "Getting the model summary"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "AvA1HtT0_ENP",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "AvA1HtT0_ENP",
    "outputId": "8add1d92-b7a8-427f-c3a2-c312f71a5859"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_7\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "text_vectorization (TextVect (None, None)              0         \n",
      "_________________________________________________________________\n",
      "embedding_7 (Embedding)      (None, None, 64)          640000    \n",
      "_________________________________________________________________\n",
      "conv1d_8 (Conv1D)            (None, None, 64)          20544     \n",
      "_________________________________________________________________\n",
      "max_pooling1d_4 (MaxPooling1 (None, None, 64)          0         \n",
      "_________________________________________________________________\n",
      "conv1d_9 (Conv1D)            (None, None, 64)          20544     \n",
      "_________________________________________________________________\n",
      "global_max_pooling1d_1 (Glob (None, 64)                0         \n",
      "_________________________________________________________________\n",
      "dense_14 (Dense)             (None, 32)                2080      \n",
      "_________________________________________________________________\n",
      "dropout_7 (Dropout)          (None, 32)                0         \n",
      "_________________________________________________________________\n",
      "dense_15 (Dense)             (None, 4)                 132       \n",
      "=================================================================\n",
      "Total params: 683,300\n",
      "Trainable params: 683,300\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "-ZxrgxpJ_emM",
   "metadata": {
    "id": "-ZxrgxpJ_emM"
   },
   "source": [
    "We can also plot the model with Keras util's `plot_model`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4W5-l3I8_ORy",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 953
    },
    "id": "4W5-l3I8_ORy",
    "outputId": "429e25cb-8afb-4408-88b5-e69c9a6b4bfb"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from tensorflow.keras.utils import plot_model\n",
    "\n",
    "plot_model(model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "BsFlZKCb_re9",
   "metadata": {
    "id": "BsFlZKCb_re9"
   },
   "outputs": [],
   "source": [
    "# Compile the model\n",
    "\n",
    "model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "LlwXZMa_Bk30",
   "metadata": {
    "id": "LlwXZMa_Bk30"
   },
   "outputs": [],
   "source": [
    "batch_size = 32\n",
    "\n",
    "train_steps = int(len(train_data)/batch_size)\n",
    "val_steps = int(len(val_data)/batch_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "MYogW_sH_r-f",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "MYogW_sH_r-f",
    "outputId": "b947c7d3-8830-45fa-b9c0-22fed7ff0576"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/25\n",
      "105/105 [==============================] - 3s 23ms/step - loss: 1.3313 - accuracy: 0.3470 - val_loss: 1.0612 - val_accuracy: 0.4753\n",
      "Epoch 2/25\n",
      "105/105 [==============================] - 2s 22ms/step - loss: 0.9455 - accuracy: 0.5565 - val_loss: 0.7538 - val_accuracy: 0.7368\n",
      "Epoch 3/25\n",
      "105/105 [==============================] - 2s 21ms/step - loss: 0.6512 - accuracy: 0.7580 - val_loss: 0.4937 - val_accuracy: 0.8240\n",
      "Epoch 4/25\n",
      "105/105 [==============================] - 2s 21ms/step - loss: 0.4899 - accuracy: 0.8339 - val_loss: 0.4605 - val_accuracy: 0.8339\n",
      "Epoch 5/25\n",
      "105/105 [==============================] - 2s 21ms/step - loss: 0.4775 - accuracy: 0.8318 - val_loss: 0.4126 - val_accuracy: 0.8586\n",
      "Epoch 6/25\n",
      "105/105 [==============================] - 2s 21ms/step - loss: 0.4359 - accuracy: 0.8518 - val_loss: 0.3818 - val_accuracy: 0.8783\n",
      "Epoch 7/25\n",
      "105/105 [==============================] - 2s 22ms/step - loss: 0.4106 - accuracy: 0.8717 - val_loss: 0.3710 - val_accuracy: 0.8799\n",
      "Epoch 8/25\n",
      "105/105 [==============================] - 2s 21ms/step - loss: 0.4174 - accuracy: 0.8679 - val_loss: 0.3561 - val_accuracy: 0.8980\n",
      "Epoch 9/25\n",
      "105/105 [==============================] - 2s 21ms/step - loss: 0.3927 - accuracy: 0.8762 - val_loss: 0.3509 - val_accuracy: 0.8964\n",
      "Epoch 10/25\n",
      "105/105 [==============================] - 2s 21ms/step - loss: 0.4001 - accuracy: 0.8687 - val_loss: 0.3444 - val_accuracy: 0.8865\n",
      "Epoch 11/25\n",
      "105/105 [==============================] - 2s 21ms/step - loss: 0.3778 - accuracy: 0.8815 - val_loss: 0.3540 - val_accuracy: 0.8914\n",
      "Epoch 12/25\n",
      "105/105 [==============================] - 2s 21ms/step - loss: 0.3796 - accuracy: 0.8815 - val_loss: 0.3159 - val_accuracy: 0.8997\n",
      "Epoch 13/25\n",
      "105/105 [==============================] - 2s 21ms/step - loss: 0.3678 - accuracy: 0.8783 - val_loss: 0.3173 - val_accuracy: 0.9013\n",
      "Epoch 14/25\n",
      "105/105 [==============================] - 2s 22ms/step - loss: 0.3780 - accuracy: 0.8804 - val_loss: 0.3228 - val_accuracy: 0.9013\n",
      "Epoch 15/25\n",
      "105/105 [==============================] - 2s 21ms/step - loss: 0.3827 - accuracy: 0.8815 - val_loss: 0.2875 - val_accuracy: 0.8997\n",
      "Epoch 16/25\n",
      "105/105 [==============================] - 2s 21ms/step - loss: 0.3578 - accuracy: 0.8857 - val_loss: 0.2855 - val_accuracy: 0.9161\n",
      "Epoch 17/25\n",
      "105/105 [==============================] - 2s 21ms/step - loss: 0.3807 - accuracy: 0.8789 - val_loss: 0.2834 - val_accuracy: 0.9128\n",
      "Epoch 18/25\n",
      "105/105 [==============================] - 2s 21ms/step - loss: 0.3572 - accuracy: 0.8875 - val_loss: 0.3027 - val_accuracy: 0.9013\n",
      "Epoch 19/25\n",
      "105/105 [==============================] - 2s 22ms/step - loss: 0.3630 - accuracy: 0.8815 - val_loss: 0.2976 - val_accuracy: 0.9030\n",
      "Epoch 20/25\n",
      "105/105 [==============================] - 2s 22ms/step - loss: 0.3646 - accuracy: 0.8851 - val_loss: 0.2832 - val_accuracy: 0.9112\n",
      "Epoch 21/25\n",
      "105/105 [==============================] - 2s 22ms/step - loss: 0.3542 - accuracy: 0.8908 - val_loss: 0.2755 - val_accuracy: 0.9145\n",
      "Epoch 22/25\n",
      "105/105 [==============================] - 2s 21ms/step - loss: 0.3363 - accuracy: 0.8884 - val_loss: 0.2807 - val_accuracy: 0.9145\n",
      "Epoch 23/25\n",
      "105/105 [==============================] - 2s 21ms/step - loss: 0.2961 - accuracy: 0.9080 - val_loss: 0.2766 - val_accuracy: 0.9178\n",
      "Epoch 24/25\n",
      "105/105 [==============================] - 2s 21ms/step - loss: 0.3437 - accuracy: 0.8911 - val_loss: 0.2758 - val_accuracy: 0.9145\n",
      "Epoch 25/25\n",
      "105/105 [==============================] - 2s 21ms/step - loss: 0.3452 - accuracy: 0.8908 - val_loss: 0.2707 - val_accuracy: 0.9145\n"
     ]
    }
   ],
   "source": [
    "# Train the model\n",
    "\n",
    "history = model.fit(train_data, \n",
    "                    epochs=25,\n",
    "                    validation_data=val_data,\n",
    "                    steps_per_epoch=train_steps,\n",
    "                    validation_steps=val_steps\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ij7aQcxzDKuF",
   "metadata": {
    "id": "ij7aQcxzDKuF"
   },
   "source": [
    "<a name='2-4'></a>\n",
    "\n",
    "## 2.4 Visualizing the Results"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "FkrAuEhiDWDL",
   "metadata": {
    "id": "FkrAuEhiDWDL"
   },
   "source": [
    "It is always a good practice to plot the model results. When doing error analysis, plotting learning curve becomes helpful. \n",
    "\n",
    "Let's plot the loss and accuracy over on the course of epochs."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "svEnW6sP_tdq",
   "metadata": {
    "id": "svEnW6sP_tdq"
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# function to plot accuracy and loss\n",
    "\n",
    "def plot_acc_loss(history):\n",
    "\n",
    "  model_history = history.history\n",
    "  acc = model_history['accuracy']\n",
    "  val_acc = model_history['val_accuracy']\n",
    "  loss = model_history['loss']\n",
    "  val_loss = model_history['val_loss']\n",
    "  epochs = history.epoch\n",
    "\n",
    "  plt.figure(figsize=(10,5))\n",
    "  plt.plot(epochs, acc, 'r', label='Training Accuracy')\n",
    "  plt.plot(epochs, val_acc, 'g', label='Validation Accuracy')\n",
    "  plt.title('Training and validation accuracy')\n",
    "  plt.xlabel('Epochs')\n",
    "  plt.ylabel('Accuracy')\n",
    "  plt.legend(loc=0)\n",
    "\n",
    "  # Create a new figure with plt.figure()\n",
    "  plt.figure()\n",
    "\n",
    "  plt.figure(figsize=(10,5))\n",
    "  plt.plot(epochs, loss, 'b', label='Training Loss')\n",
    "  plt.plot(epochs, val_loss, 'y', label='Validation Loss')\n",
    "  plt.title('Training and Validation Loss')\n",
    "  plt.xlabel('Epochs')\n",
    "  plt.ylabel('Loss')\n",
    "  plt.legend(loc=0)\n",
    "  plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "TBfANPX3EEym",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 700
    },
    "id": "TBfANPX3EEym",
    "outputId": "818e5e85-bca5-4c86-fbdc-5edaefe0844d"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmMAAAFNCAYAAABMhmimAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd3ic1Zn+8e+jUbOabVX3QjMG2xTLeDECbJKYYgeRUB1KDCEElsCGDSXJhvJLQmBTCRtSIKSxWRvSCITeDTiAC26Y7oK7qlWsOjPn98c7sooleUbSaDTS/bmuuaa95ZkZG9+cc95zzDmHiIiIiMRGQqwLEBERERnKFMZEREREYkhhTERERCSGFMZEREREYkhhTERERCSGFMZEREREYkhhTEQws6fM7It9vW0smdkWM/t0FI77spldGXp8sZk9G862PTjPBDOrNTNfT2sVkfigMCYSp0L/ULfcgmZW3+b5xZEcyzl3pnPuD3297UBkZt8ws2WdvJ5rZk1mNi3cYznn/uScm99HdbULj865T5xzGc65QF8cv8O5nJkd1tfHFZGeURgTiVOhf6gznHMZwCfAZ9u89qeW7cwsMXZVDkj/C8wxs8kdXr8IWO+c2xCDmkRkCFMYExlkzGyumW03s1vMbDfwOzMbaWb/NLNSM6sMPR7XZp+2XW+Lzew1M/tRaNvNZnZmD7edbGbLzKzGzJ43s/vM7H+7qDucGr9rZq+HjvesmeW2ef9SM9tqZuVm9l9dfT/Oue3Ai8ClHd66DPjjweroUPNiM3utzfPPmNl7ZlZlZj8HrM17h5rZi6H6yszsT2Y2IvTeQ8AE4PFQy+bNZjYp1IKVGNpmjJk9ZmYVZvaRmX25zbHvMLNHzOyPoe/mHTMr7Oo76IqZDQ8dozT0XX7bzBJC7x1mZq+EPluZmT0cet3M7KdmVmJm1Wa2PpLWRRFRGBMZrEYB2cBE4Cq8v+u/Cz2fANQDP+9m/9nA+0Au8APgQTOzHmz7f8BbQA5wBwcGoLbCqfELwOVAPpAM3AhgZkcBvwwdf0zofJ0GqJA/tK3FzKYAx4bqjfS7ajlGLvA34Nt438XHwEltNwHuCtU3FRiP953gnLuU9q2bP+jkFEuB7aH9zwO+b2antXn/7NA2I4DHwqm5E/8DDAcOAU7FC6iXh977LvAsMBLvu/2f0OvzgVOAI0L7XgCU9+DcIkOWwpjI4BQEbnfONTrn6p1z5c65vzrn6pxzNcCdeP/YdmWrc+6B0HilPwCjgYJItjWzCcAs4DbnXJNz7jW8kNCpMGv8nXPuA+dcPfAIXoACL5z80zm3zDnXCNwa+g668vdQjXNCzy8DnnLOlfbgu2pxFvCOc+4vzrlm4B5gd5vP95Fz7rnQb1IK/CTM42Jm4/GC3S3OuQbn3BrgN6G6W7zmnHsy9Ds8BBwTzrHbnMOH11X7TedcjXNuC/BjWkNrM15AHROq4bU2r2cCRwLmnHvXObcrknOLDHUKYyKDU6lzrqHliZmlmdmvQ11P1cAyYIR1faVe2xBRF3qYEeG2Y4CKNq8BbOuq4DBr3N3mcV2bmsa0PbZzbh/dtM6EavozcFmoFe9i4I8R1NGZjjW4ts/NrMDMlprZjtBx/xevBS0cLd9lTZvXtgJj2zzv+N2kWmTjBXOBpNBxOzvHzXite2+FukGvAHDOvYjXCncfUGJm95tZVgTnFRnyFMZEBifX4fnXgSnAbOdcFl63ErQZ0xQFu4BsM0tr89r4brbvTY272h47dM6cg+zzB7wutc/gtew83ss6OtZgtP+838f7XaaHjntJh2N2/M3a2on3XWa2eW0CsOMgNUWijNbWrwPO4Zzb7Zz7snNuDPAV4BcWuiLTOXevc24mcBRed+VNfViXyKCnMCYyNGTijX3aa2bZwO3RPqFzbiuwErjDzJLN7ETgs1Gq8S/AQjMrMrNk4Dsc/L9vrwJ7gfuBpc65pl7W8QRwtJl9PtQidT3e2L0WmUAtUGVmYzkwsOzBG6t1AOfcNmA5cJeZpZrZDOBLeK1rPZUcOlaqmaWGXnsEuNPMMs1sIvCfLecws/PbXMhQiRceg2Y2y8xmm1kSsA9ooPsuYhHpQGFMZGi4BxiG1/rxBvB0P533YuBEvC7D7wEPA41dbNvjGp1z7wDX4g3A34UXFrYfZB+H1zU5MXTfqzqcc2XA+cDdeJ/3cOD1Npv8P+B4oAovuP2twyHuAr5tZnvN7MZOTrEImITXSvZ3vDGBz4dTWxfewQudLbfLgevwAtUm4DW87/O3oe1nAW+aWS3e2L//cM5tArKAB/C+8614n/2HvahLZMgx779HIiLRF5oO4T3nXNRb5kRE4oVaxkQkakJdWIeaWYKZnQEUA4/Gui4RkYFEM3OLSDSNwuuOy8HrNrzGOfd2bEsSERlY1E0pIiIiEkPqphQRERGJIYUxERERkRiKuzFjubm5btKkSbEuQ0REROSgVq1aVeacy+tum7gLY5MmTWLlypWxLkNERETkoMxs68G2UTeliIiISAwpjImIiIjEkMKYiIiISAzF3ZgxERGRwa65uZnt27fT0NAQ61IkTKmpqYwbN46kpKSI91UYExERGWC2b99OZmYmkyZNwsxiXY4chHOO8vJytm/fzuTJkyPeX92UIiIiA0xDQwM5OTkKYnHCzMjJyelxS6bCmIiIyACkIBZfevN7KYyJiIjIfuXl5Rx77LEce+yxjBo1irFjx+5/3tTU1O2+K1eu5Prrrz/oOebMmdMntb788sssXLiwT44VSxozJiIiIvvl5OSwZs0aAO644w4yMjK48cYb97/v9/tJTOw8PhQWFlJYWHjQcyxfvrxvih0k1DLWQWkp/PrXsHNnrCsREREZGBYvXszVV1/N7Nmzufnmm3nrrbc48cQTOe6445gzZw7vv/8+0L6l6o477uCKK65g7ty5HHLIIdx77737j5eRkbF/+7lz53Leeedx5JFHcvHFF+OcA+DJJ5/kyCOPZObMmVx//fURtYAtWbKE6dOnM23aNG655RYAAoEAixcvZtq0aUyfPp2f/vSnANx7770cddRRzJgxg4suuqj3X1YPqGWsg9274eqrYdgwuOyyWFcjIiIyMGzfvp3ly5fj8/morq7m1VdfJTExkeeff55vfetb/PWvfz1gn/fee4+XXnqJmpoapkyZwjXXXHPA1A9vv/0277zzDmPGjOGkk07i9ddfp7CwkK985SssW7aMyZMns2jRorDr3LlzJ7fccgurVq1i5MiRzJ8/n0cffZTx48ezY8cONmzYAMDevXsBuPvuu9m8eTMpKSn7X+tvCmMdHH00DB8Or72mMCYiIrH3ta9BqNewzxx7LNxzT2T7nH/++fh8PgCqqqr44he/yIcffoiZ0dzc3Ok+CxYsICUlhZSUFPLz89mzZw/jxo1rt80JJ5yw/7Vjjz2WLVu2kJGRwSGHHLJ/mohFixZx//33h1XnihUrmDt3Lnl53trcF198McuWLePWW29l06ZNXHfddSxYsID58+cDMGPGDC6++GLOOecczjnnnMi+lD6ibsoOEhLgpJO8MCYiIiKe9PT0/Y9vvfVW5s2bx4YNG3j88ce7nNIhJSVl/2Ofz4ff7+/RNn1h5MiRrF27lrlz5/KrX/2KK6+8EoAnnniCa6+9ltWrVzNr1qyonb87ahnrRFERPPkklJVBbm6sqxERkaEs0has/lBVVcXYsWMB+P3vf9/nx58yZQqbNm1iy5YtTJo0iYcffjjsfU844QSuv/56ysrKGDlyJEuWLOG6666jrKyM5ORkzj33XKZMmcIll1xCMBhk27ZtzJs3j6KiIpYuXUptbS0jRozo88/UHYWxTpx8sne/fDmcfXZsaxERERlobr75Zr74xS/yve99jwULFvT58YcNG8YvfvELzjjjDNLT05k1a1aX277wwgvtuj7//Oc/c/fddzNv3jyccyxYsIDi4mLWrl3L5ZdfTjAYBOCuu+4iEAhwySWXUFVVhXOO66+/vt+DGIC1XLUQLwoLC93KlSujeo6GBm/c2PXXww9/GNVTiYiIHODdd99l6tSpsS4jpmpra8nIyMA5x7XXXsvhhx/ODTfcEOuyutXZ72Zmq5xz3c73oTFjnUhNhVmzNG5MREQkVh544AGOPfZYjj76aKqqqvjKV74S65KiRt2UXSgqgp/8BOrqIC0t1tWIiIgMLTfccMOAbwnrK2oZ60JRETQ3w4oVsa5EREREBjOFsS6cdJJ3/+qrsa1DREREBjeFsS6MHAnTpmncmIiIiESXwlg3ioq86S0CgVhXIiIiIoOVwlg3ioqgpgbWr491JSIiIv1n3rx5PPPMM+1eu+eee7jmmmu63Gfu3Lm0TD111llndbrO4x133MGPfvSjbs/96KOPsnHjxv3Pb7vtNp5//vlIyu9U20XMBxqFsW60TP6qrkoRERlKFi1axNKlS9u9tnTp0rAX7H7yySd7PHlqxzD2ne98h09/+tM9Ola8UBjrxoQJMH68BvGLiMjQct555/HEE0/Q1NQEwJYtW9i5cycnn3wy11xzDYWFhRx99NHcfvvtne4/adIkysrKALjzzjs54ogjKCoq4v3339+/zQMPPMCsWbM45phjOPfcc6mrq2P58uU89thj3HTTTRx77LF8/PHHLF68mL/85S+AN9v+cccdx/Tp07niiitobGzcf77bb7+d448/nunTp/Pee++F/VmXLFnC9OnTmTZtGrfccgsAgUCAxYsXM23aNKZPn85Pf/pTAO69916OOuooZsyYwUUXXRTht9o1hbGDKCryWsbibKECERGRHsvOzuaEE07gqaeeArxWsQsuuAAz484772TlypWsW7eOV155hXXr1nV5nFWrVrF06VLWrFnDk08+yYo280V9/vOfZ8WKFaxdu5apU6fy4IMPMmfOHM4++2x++MMfsmbNGg499ND92zc0NLB48WIefvhh1q9fj9/v55e//OX+93Nzc1m9ejXXXHPNQbtCW+zcuZNbbrmFF198kTVr1rBixQoeffRR1qxZw44dO9iwYQPr16/n8ssvB+Duu+/m7bffZt26dfzqV7+K6DvtjiZ9PYiiIliyBLZsgcmTY12NiIgMNR9++DVqa9f06TEzMo7l8MO7X4G8pauyuLiYpUuX8uCDDwLwyCOPcP/99+P3+9m1axcbN25kxowZnR7j1Vdf5XOf+xxpodnTz26z4POGDRv49re/zd69e6mtreX000/vtp7333+fyZMnc8QRRwDwxS9+kfvuu4+vfe1rgBfuAGbOnMnf/va3ML4FWLFiBXPnziUvLw+Aiy++mGXLlnHrrbeyadMmrrvuOhYsWMD8+fMBmDFjBhdffDHnnHMO55xzTljnCIdaxg6iqMi717gxEREZSoqLi3nhhRdYvXo1dXV1zJw5k82bN/OjH/2IF154gXXr1rFgwQIaGhp6dPzFixfz85//nPXr13P77bf3+DgtUlJSAPD5fPj9/l4da+TIkaxdu5a5c+fyq1/9iiuvvBKAJ554gmuvvZbVq1cza9asXp+nhVrGDmLaNG/R8Ndeg0svjXU1IiIy1BysBStaMjIymDdvHldcccX+gfvV1dWkp6czfPhw9uzZw1NPPcXcuXO7PMYpp5zC4sWL+eY3v4nf7+fxxx/fv8ZkTU0No0ePprm5mT/96U+MHTsWgMzMTGpqag441pQpU9iyZQsfffQRhx12GA899BCnnnpqrz7jCSecwPXXX09ZWRkjR45kyZIlXHfddZSVlZGcnMy5557LlClTuOSSSwgGg2zbto158+ZRVFTE0qVLqa2t7fGFCm0pjB1EQoI3G78G8YuIyFCzaNEiPve5z+2/svKYY47huOOO48gjj2T8+PGc1LJcTReOP/54LrzwQo455hjy8/OZNWvW/ve++93vMnv2bPLy8pg9e/b+AHbRRRfx5S9/mXvvvXf/wH2A1NRUfve733H++efj9/uZNWsW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\n",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_acc_loss(history)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "O4VhDVeyEe21",
   "metadata": {
    "id": "O4VhDVeyEe21"
   },
   "source": [
    "That's not pretty bad. Let's combine CNNs and LSTMs to see if we can improve the results further."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "y3XoobxUExsk",
   "metadata": {
    "id": "y3XoobxUExsk"
   },
   "source": [
    "<a name='3'></a>\n",
    "\n",
    "# 3. Combining CNNs and RNNs for Text Classification"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "Q0kU2WjgXuB_",
   "metadata": {
    "id": "Q0kU2WjgXuB_"
   },
   "source": [
    "<a name='3-1'></a>\n",
    "\n",
    "## 3.1 Convnets and RNNs Model"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b9DkAUa-ONQc",
   "metadata": {
    "id": "b9DkAUa-ONQc"
   },
   "source": [
    "Just like how CNNs extract the features in images, they are also able to `learn the hierarchical representations of words, phrases and sentences in order to understand text`[(Yann LeCun, 2016)](https://arxiv.org/pdf/1502.01710.pdf). The downside of using CNNs alone is that they don't maintain the order of timesteps.\n",
    "\n",
    "We can also introduce Recurrent Neural Networks (LSTMs specifically) to give the network the sequence handling capability. So, `Conv1D` can extract meaningful words in input sentences, and RNNs can preverve the sequence contained in the output features from the CNNs.\n",
    "\n",
    "I am only going to add one bidirectional LSTM layer to handle the CNNs features from both directions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "_CVCM-xOEQfp",
   "metadata": {
    "id": "_CVCM-xOEQfp"
   },
   "outputs": [],
   "source": [
    "conv_rnn_model = tf.keras.Sequential([\n",
    "    text_vectorizer,\n",
    "    tf.keras.layers.Embedding(input_dim=input_dim, output_dim=64, mask_zero=True),\n",
    "    tf.keras.layers.Conv1D(64, 5, activation='relu'),\n",
    "    tf.keras.layers.MaxPooling1D(),\n",
    "    tf.keras.layers.Conv1D(64, 5, activation='relu'),\n",
    "    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64)),\n",
    "    tf.keras.layers.Dense(32, activation='relu'),\n",
    "    tf.keras.layers.Dropout(0.3),\n",
    "    tf.keras.layers.Dense(4, activation='softmax')\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "MqPg0zq3ST86",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "MqPg0zq3ST86",
    "outputId": "b2529078-78ef-4602-e1a5-853d59ec24ee"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_9\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "text_vectorization (TextVect (None, None)              0         \n",
      "_________________________________________________________________\n",
      "embedding_9 (Embedding)      (None, None, 64)          640000    \n",
      "_________________________________________________________________\n",
      "conv1d_12 (Conv1D)           (None, None, 64)          20544     \n",
      "_________________________________________________________________\n",
      "max_pooling1d_6 (MaxPooling1 (None, None, 64)          0         \n",
      "_________________________________________________________________\n",
      "conv1d_13 (Conv1D)           (None, None, 64)          20544     \n",
      "_________________________________________________________________\n",
      "bidirectional_1 (Bidirection (None, 128)               66048     \n",
      "_________________________________________________________________\n",
      "dense_18 (Dense)             (None, 32)                4128      \n",
      "_________________________________________________________________\n",
      "dropout_9 (Dropout)          (None, 32)                0         \n",
      "_________________________________________________________________\n",
      "dense_19 (Dense)             (None, 4)                 132       \n",
      "=================================================================\n",
      "Total params: 751,396\n",
      "Trainable params: 751,396\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "conv_rnn_model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "uuNC33CkSkWW",
   "metadata": {
    "id": "uuNC33CkSkWW"
   },
   "outputs": [],
   "source": [
    "# Compile the model\n",
    "\n",
    "conv_rnn_model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "VyNJoWe1SoWu",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "VyNJoWe1SoWu",
    "outputId": "b01c77cc-a10f-475d-e881-02087b9aa853"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/25\n",
      "105/105 [==============================] - 9s 53ms/step - loss: 1.3051 - accuracy: 0.3119 - val_loss: 0.9660 - val_accuracy: 0.5164\n",
      "Epoch 2/25\n",
      "105/105 [==============================] - 5s 47ms/step - loss: 0.8398 - accuracy: 0.5753 - val_loss: 0.6016 - val_accuracy: 0.7122\n",
      "Epoch 3/25\n",
      "105/105 [==============================] - 5s 45ms/step - loss: 0.6768 - accuracy: 0.6732 - val_loss: 0.5675 - val_accuracy: 0.7023\n",
      "Epoch 4/25\n",
      "105/105 [==============================] - 5s 45ms/step - loss: 0.6061 - accuracy: 0.7125 - val_loss: 0.4932 - val_accuracy: 0.8092\n",
      "Epoch 5/25\n",
      "105/105 [==============================] - 5s 45ms/step - loss: 0.5031 - accuracy: 0.8176 - val_loss: 0.3908 - val_accuracy: 0.8618\n",
      "Epoch 6/25\n",
      "105/105 [==============================] - 5s 45ms/step - loss: 0.4422 - accuracy: 0.8530 - val_loss: 0.3892 - val_accuracy: 0.8651\n",
      "Epoch 7/25\n",
      "105/105 [==============================] - 5s 46ms/step - loss: 0.4099 - accuracy: 0.8682 - val_loss: 0.3633 - val_accuracy: 0.8766\n",
      "Epoch 8/25\n",
      "105/105 [==============================] - 5s 46ms/step - loss: 0.3913 - accuracy: 0.8723 - val_loss: 0.3623 - val_accuracy: 0.8931\n",
      "Epoch 9/25\n",
      "105/105 [==============================] - 5s 44ms/step - loss: 0.4082 - accuracy: 0.8729 - val_loss: 0.3184 - val_accuracy: 0.8914\n",
      "Epoch 10/25\n",
      "105/105 [==============================] - 5s 46ms/step - loss: 0.3846 - accuracy: 0.8774 - val_loss: 0.3063 - val_accuracy: 0.9062\n",
      "Epoch 11/25\n",
      "105/105 [==============================] - 5s 45ms/step - loss: 0.3521 - accuracy: 0.8893 - val_loss: 0.3091 - val_accuracy: 0.8947\n",
      "Epoch 12/25\n",
      "105/105 [==============================] - 5s 45ms/step - loss: 0.3430 - accuracy: 0.8860 - val_loss: 0.3341 - val_accuracy: 0.8832\n",
      "Epoch 13/25\n",
      "105/105 [==============================] - 5s 47ms/step - loss: 0.3542 - accuracy: 0.8824 - val_loss: 0.3040 - val_accuracy: 0.9013\n",
      "Epoch 14/25\n",
      "105/105 [==============================] - 5s 47ms/step - loss: 0.3754 - accuracy: 0.8783 - val_loss: 0.2929 - val_accuracy: 0.8931\n",
      "Epoch 15/25\n",
      "105/105 [==============================] - 5s 44ms/step - loss: 0.3500 - accuracy: 0.8911 - val_loss: 0.2831 - val_accuracy: 0.8997\n",
      "Epoch 16/25\n",
      "105/105 [==============================] - 5s 45ms/step - loss: 0.3486 - accuracy: 0.8872 - val_loss: 0.2908 - val_accuracy: 0.9079\n",
      "Epoch 17/25\n",
      "105/105 [==============================] - 5s 48ms/step - loss: 0.3634 - accuracy: 0.8869 - val_loss: 0.2785 - val_accuracy: 0.9013\n",
      "Epoch 18/25\n",
      "105/105 [==============================] - 5s 45ms/step - loss: 0.3377 - accuracy: 0.8923 - val_loss: 0.2645 - val_accuracy: 0.9095\n",
      "Epoch 19/25\n",
      "105/105 [==============================] - 5s 46ms/step - loss: 0.3374 - accuracy: 0.8881 - val_loss: 0.2703 - val_accuracy: 0.9145\n",
      "Epoch 20/25\n",
      "105/105 [==============================] - 5s 46ms/step - loss: 0.3429 - accuracy: 0.8872 - val_loss: 0.2572 - val_accuracy: 0.9095\n",
      "Epoch 21/25\n",
      "105/105 [==============================] - 5s 45ms/step - loss: 0.3282 - accuracy: 0.8955 - val_loss: 0.2549 - val_accuracy: 0.9030\n",
      "Epoch 22/25\n",
      "105/105 [==============================] - 5s 45ms/step - loss: 0.3187 - accuracy: 0.8914 - val_loss: 0.2502 - val_accuracy: 0.9095\n",
      "Epoch 23/25\n",
      "105/105 [==============================] - 5s 45ms/step - loss: 0.3061 - accuracy: 0.8970 - val_loss: 0.2420 - val_accuracy: 0.9161\n",
      "Epoch 24/25\n",
      "105/105 [==============================] - 5s 47ms/step - loss: 0.3204 - accuracy: 0.8988 - val_loss: 0.2544 - val_accuracy: 0.9128\n",
      "Epoch 25/25\n",
      "105/105 [==============================] - 5s 46ms/step - loss: 0.3244 - accuracy: 0.8973 - val_loss: 0.2571 - val_accuracy: 0.9062\n"
     ]
    }
   ],
   "source": [
    "batch_size = 32\n",
    "\n",
    "train_steps = int(len(train_data)/batch_size)\n",
    "val_steps = int(len(val_data)/batch_size)\n",
    "\n",
    "\n",
    "# Train the model\n",
    "\n",
    "history = conv_rnn_model.fit(train_data, \n",
    "                    epochs=25,\n",
    "                    validation_data=val_data,\n",
    "                    steps_per_epoch=train_steps,\n",
    "                    validation_steps=val_steps\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0m-Af23yX42N",
   "metadata": {
    "id": "0m-Af23yX42N"
   },
   "source": [
    "<a name='3-2'></a>\n",
    "\n",
    "## 3.2 Visualizing the Results"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "WMU8AoM0Thoe",
   "metadata": {
    "id": "WMU8AoM0Thoe"
   },
   "source": [
    "Plotting the model results..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "-P0wZ99KSu5P",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 700
    },
    "id": "-P0wZ99KSu5P",
    "outputId": "7669d1c7-52b3-445e-e5ab-cd0046ddf1dd"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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7ruceuqppKSkMH36dMrLyxk8eDDZ2dmAFxpPPvnkyu0TqXVGyBMpPd3rFdPcABERqc2dd3rrUQbSmDHw5JNNOiUrK4tly5YRHh7OoUOHWLp0KREREaSmpnLffffxj3/847hzNm7cyJIlSzh8+DBDhw5lzpw5xy3NsGbNGtatW0efPn04/fTT+fTTTxk/fjy33norH3/8MQMHDuSaa66ps64FCxZwzTXXcOmll3LfffdRUlJChw4duOOOOzj77LNZuHAhZWVlHDlyhHXr1vHLX/6SZcuWkZCQwMGDBxt83+np6Xz11VeV32J8/vnniY+Pp6CggNNOO40rrriC8vJybr755sp6Dx48SFhYGNdddx0vv/wyd955J6mpqaSkpJAYgtseqmesPkVF8NVXGqIUEZEW78orryQ8PByAvLw8rrzySk455RTuuusu1q1bV+s5F198MZ06dSIhIYEePXqwd+/e446ZMGECSUlJhIWFMWbMGDIzM9m4cSODBg2qDEB1hbHi4mIWL17MZZddRrdu3Zg4cSLvvfceAB988AFz5swBIDw8nJiYGD744AOuvPJKEhISAIiPj2/wfU+YMKHachJPP/00KSkpTJo0iR07drB582ZWrFjBWWedVXlcRbs33ngjL774IuCFuBtuuKHB6wWDesbq89VXUFKiMCYiInVrYg9WsHTp0qXy9f33388555zDwoULyczMZOrUqbWe06lTp8rX4eHhlJaWNuuYurz33nvk5uYyatQoAPLz84mKiqpzSLMuERERlZP/y8vLq31Roer7/vDDD0lNTWX58uV07tyZqVOn1rvcRHJyMj179uSDDz7g888/5+WXX25SXYGinrH6VEze1xpjIiLSiuTl5dG3b18A/vKXvwS8/aFDh7J161YyMzMBePXVV2s9bsGCBTz33HNkZmaSmZlJRkYG77//Pvn5+UyfPp1nn30WgLKyMvLy8pg2bRqvvfYaBw4cAKgcphwwYACrV68GYNGiRZSUlNR6vby8POLi4ujcuTMbN25kxYoVAEyaNImPP/6YjIyMau0CfO973+O6666r1rN4oimM1Sc9HWJioBmr6YqIiITKPffcw7333svYsWOb1JPVWFFRUfzhD3/gggsuYNy4cXTt2pWYmJhqx+Tn5/Puu+9y8cUXV+7r0qULZ5xxBm+99RZPPfUUS5YsYdSoUYwb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\n",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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RFMf/OW4HvjLhtc755bHtiQRkbZFlylFREREYkiXKUVERERiSGFMREREJIbirs9Yz5493eDBg2NdhoiIiEiDli5dmuecy6pvm7gLY4MHD2bJkiWxLkNERESkQWa2taFtdJlSREREJIYUxkRERERiSGFMREREJIbirs+YiIhIe1daWsqOHTsoKiqKdSnSSKmpqWRnZ5OUlNTkfRXGRERE2pgdO3bQtWtXBg8ejJnFuhxpgHOOAwcOsGPHDoYMGdLk/XWZUkREpI0pKiqiR48eCmJxwszo0aNHs1syFcZERETaIAWx+NKS70thTERERCodOHCAyZMnM3nyZPr06UP//v0rX5eUlNS775IlS7jpppsaPMepp54akVrffPNNPvvZz0bkWLGkPmMiIiJSqUePHqxYsQKAu+++my5duvDtb3+78v2ysjISE2uPD7m5ueTm5jZ4jvfeey8yxbYTahmrYf9++PWvYceOWFciIiLSNsyfP5/rrruOk08+mVtuuYUPP/yQU045hSlTpnDqqaeyfv16oHpL1d13382VV17JjBkzGDp0KA8++GDl8bp06VK5/YwZM/jiF7/I6NGjmTt3Ls45AF544QVGjx7N1KlTuemmm5rUAvbUU08xYcIExo8fz6233gpAeXk58+fPZ/z48UyYMIFf/OIXADz44IOMHTuWiRMnctlll7X8w2oGtYzVsGcPXHcd/PGPMHdurKsRERFpG3bs2MF7771HIBAgPz+ft99+m8TERF577TW++93v8n//938n7LNu3Tr++c9/cvToUUaNGsX1119/wtAPy5cvZ82aNfTr14/TTjuNd999l9zcXK699loWLVrEkCFDmDNnTqPr3LVrF7feeitLly4lMzOTWbNm8eyzzzJgwAB27tzJ6tWrATh8+DAA9913H5s3byYlJaVyXWtTGKthzBhITYVlyxTGREQk9r7xDQheNYyYyZPhl79s2j6XXHIJgUAAgCNHjnD55ZezYcMGzIzS0tJa97ngggtISUkhJSWFXr16sXfvXrKzs6ttc9JJJ1Wumzx5Mlu2bKFLly4MHTq0cpiIOXPm8OijjzaqzsWLFzNjxgyysvzc3HPnzmXRokXceeedbNq0iRtvvJELLriAWbNmATBx4kTmzp3LRRddxEUXXdS0DyVCdJmyhsREmDjRhzERERHxOnfuXLl85513MnPmTFavXs1zzz1X55AOKSkplcuBQICysrJmbRMJmZmZfPTRR8yYMYNHHnmEq666CoDnn3+eG264gWXLljFt2rSonb8+ahmrxdSp8OSTUFEBCYqrIiISQ01twWoNR44coX///gD89re/jfjxR40axaZNm9iyZQuDBw/mz3/+c6P3Pemkk7jpppvIy8sjMzOTp556ihtvvJG8vDySk5O5+OKLGTVqFPPmzaOiooLt27czc+ZMpk+fzoIFCzh27BgZGRkR/5nqo6hRi5wcyM+HzZtjXYmIiEjbc8stt3D77bczZcqUqLQkpaWl8fDDD3PuuecydepUunbtSnp6eq3bvv7662RnZ1c+tmzZwn333cfMmTOZNGkSU6dOZfbs2ezcuZMZM2YwefJk5s2bx7333kt5eTnz5s1jwoQJTJkyhZtuuqnVgxiAhe5aiBe5ubluyZIlUT3HsmW+dezpp+GSS6J6KhERkROsXbuWMWPGxLqMmDp27BhdunTBOccNN9zAiBEj+OY3vxnrsupV2/dmZkudc/WO96GWsVqMGwdJSeo3JiIiEiuPPfYYkydPZty4cRw5coRrr7021iVFjfqM1SIlBcaPVxgTERGJlW9+85ttviUsUtQyVoecHB/G4uwqroiIiMQZhbE65ORAXp5G4hcREZHoUhirQ06Of9alShEREYkmhbE6TJzoxxhTGBMREZFoUhirQ6dOfmokhTEREeloZs6cycsvv1xt3S9/+Uuuv/76OveZMWMGoaGnzj///Frnebz77rt54IEH6j33s88+y8cff1z5+vvf/z6vvfZaU8qvVfgk5m2Nwlg9Qp34RUREOpI5c+awYMGCausWLFjQ6Am7X3jhhWYPnlozjP3gBz/grLPOatax4oXCWD1ycmDXLtizJ9aViIiItJ4vfvGLPP/885SUlACwZcsWdu3axac//Wmuv/56cnNzGTduHHfddVet+w8ePJi8vDwA7rnnHkaOHMn06dNZv3595TaPPfYY06ZNY9KkSVx88cUUFBTw3nvvsXDhQr7zne8wefJkPvnkE+bPn89f//pXwI+2P2XKFCZMmMCVV15JcXFx5fnuuusucnJymDBhAuvWrWv0z/rUU08xYcIExo8fz6233gpAeXk58+fPZ/z48UyYMIFf/OIXADz44IOMHTuWiRMnctlllzXxU62bwlg9Qp34ly+PbR0i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\n",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_acc_loss(history)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "YXwQsOHkTpmH",
   "metadata": {
    "id": "YXwQsOHkTpmH"
   },
   "source": [
    "There is not a much difference with the former, but the results that we get by combining Convnets and RNNs are away good than using RNNs only. And in addition to that, it is cheaper to train it.\n",
    "\n",
    "For now, let's test our later network on new texts."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "m7OxBVxJX85p",
   "metadata": {
    "id": "m7OxBVxJX85p"
   },
   "source": [
    "<a name='3-3'></a>\n",
    "\n",
    "## 3.3 Performing Inference on New Texts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "E8LNGXB-YCAU",
   "metadata": {
    "id": "E8LNGXB-YCAU"
   },
   "outputs": [],
   "source": [
    "def predict(model, sample_news, class_names):\n",
    "\n",
    "  # Convert sample news into array\n",
    "\n",
    "  sample_news = np.array(sample_news)\n",
    "\n",
    "  # Predict the news type\n",
    "\n",
    "  preds = model.predict(sample_news)\n",
    "\n",
    "  pred_class = np.argmax(preds[0])\n",
    "\n",
    "  print(f'predicted class: {pred_class} \\nPredicted Class name: {class_names[pred_class]}')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "FE6TRM-eY7Mp",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "FE6TRM-eY7Mp",
    "outputId": "d0c5962a-5e91-44ff-a6de-aee18efe52fb"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "predicted class: 3 \n",
      "Predicted Class name: Sci/Tech\n"
     ]
    }
   ],
   "source": [
    "sample_news = ['Tesla, a self driving car company is also planning to make a humanoid robot. This humanoid robot appeared dancing in the latest Tesla AI day']\n",
    "\n",
    "predict(conv_rnn_model, sample_news, class_names)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "_fAFEQtYZzG3",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "_fAFEQtYZzG3",
    "outputId": "e9c5b95d-03fc-4ac2-cdc0-f20d3649ea8b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "predicted class: 1 \n",
      "Predicted Class name: Sports\n"
     ]
    }
   ],
   "source": [
    "sample_news = [\"In the last weeks, there has been many transfer suprises in footbal. Ronaldo went back to Old Trafford, \"\n",
    "                \"while Messi went to Paris Saint Germain to join his former colleague Neymar.\"\n",
    "                \"We can't wait to see these two clubs will perform in upcoming leagues\"]\n",
    "            \n",
    "\n",
    "predict(conv_rnn_model, sample_news, class_names)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "WX5hUh8QbHDC",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "WX5hUh8QbHDC",
    "outputId": "60c2c132-6213-4dda-96c4-cd134a5e3ffc"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "predicted class: 2 \n",
      "Predicted Class name: Business\n"
     ]
    }
   ],
   "source": [
    "sample_news = [\"In the latest business news: The tech giant NVIDIA has acquired ARM, a microproccessor company\"]\n",
    "            \n",
    "\n",
    "predict(conv_rnn_model, sample_news, class_names)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8KwUETiRkPaB",
   "metadata": {
    "id": "8KwUETiRkPaB"
   },
   "source": [
    "<a name='4'></a>\n",
    "\n",
    "# 4.  Further Learning"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "G7LNSGlmb9T6",
   "metadata": {
    "id": "G7LNSGlmb9T6"
   },
   "source": [
    "This notebook has been about using Convnets for text classification. We also brought RNNs into the picture. \n",
    "\n",
    "If you would like to learn more about sequence models, I recommend the following courses:\n",
    "\n",
    "* Deep Learning Specialization - Course 5 of Sequence models. This course is available on [Coursera](https://www.coursera.org/learn/nlp-sequence-models) and [Youtube](https://www.youtube.com/watch?v=_i3aqgKVNQI&list=PLkDaE6sCZn6F6wUI9tvS_Gw1vaFAx6rd6). \n",
    "* Intro to Deep Learning MIT - Lecture 2 of Recurrent Neural Networks, available on [Youtube](https://www.youtube.com/watch?v=qjrad0V0uJE&t=168s). \n",
    "\n",
    "For ConvNets and RNNs, I recommend the following two papers:\n",
    "\n",
    "* [Text Classification from Scratch(Yann LeCun, Xiang Zhang, 2016)](https://arxiv.org/pdf/1502.01710.pdf)\n",
    "* [Recurrent Convolutional Neural Networks for Text Classification(Siwei Lai, Liheng Xu, Kang Liu, Jun Zhao)](https://www.aaai.org/ocs/index.php/AAAI/AAAI15/paper/view/9745/9552)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bu0lYD6hgmNz",
   "metadata": {
    "id": "bu0lYD6hgmNz"
   },
   "source": [
    "## [BACK TO TOP](#0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "AXmUQ6KYgCtz",
   "metadata": {
    "id": "AXmUQ6KYgCtz"
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "collapsed_sections": [],
   "name": " 9.4 Using Convolutional Neural Networks for Texts.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3.7.10 64-bit ('tensor': conda)",
   "language": "python",
   "name": "python3710jvsc74a57bd034ac5db714c5906ee087fcf6e2d00ee4febf096586592b6ba3662ed3b7e7a5f6"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
